package com.itany.corejava.code13_jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月06日14:19
 */
public class Test01_快速入门 {
    public static final String JDBC_URL="jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
    public static void main(String[] args) {
        //添加用户
        // User user=new User("tom3","123456","12345678987","南京");
        // insertUser(user);

        //查询用户
        // List<User> users=selectAll();
        // System.out.println(users);

        //修改用户
        // User user=new User(2,"xixi","11111","13589784568","Japan");
        // updateUser(user);

        //删除用户
        deleteById(2);

    }

    /**
     * 添加用户信息
     */
    public static void insertUser(User user){
        Connection conn=null;
        Statement st=null;
        try {
            //1.注册驱动
            // 由数据库厂商所提供的驱动，根据数据库类型不同、版本不同，驱动所在包名与类名有可能不同
            //MySQL5版本为例，注册驱动是通过反射来实现的
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接
            // 连接到指定的数据库中，由数据库厂商提供了连接方式
            // 参数一：连接到数据库的url地址
            // 对于MySQL而言，url地址格式为:jdbc:mysql://mysql服务的ip地址:端口号/库名
            // ip地址：MySQL服务器所在的计算机的ip地址，可以使用本机地址:127.0.0.1 或 localhost
            // 端口号:3306
            // jdbc:mysql://127.0.0.1:3306/jdbc
            // 注意：在java访问数据库时候，有可能会出现乱码，在url后指定编码
            // ?useUnicode=true&characterEncoding=utf-8
            // 参数二：MySQL的账号
            // 参数三：MySQL的密码
           conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8","root","root");

            // 3.获取状态集，用于操作数据库
             st=conn.createStatement();

            // 4.执行sql
            String sql="insert into t_user (username,password,phone,address) values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+user.getAddress()+"')";

            // 5.执行DML操作，即：增删改查
            //返回值：受影响的数据的行数
            int rows=st.executeUpdate(sql);
            System.out.println("Query OK:"+rows+" rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库访问失败");
        } finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }

    }

    public static List<User> selectAll(){
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;//结果集
        List<User> users=new ArrayList();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获取连接
            conn=DriverManager.getConnection(JDBC_URL,"root","root");
            // 3.获取状态集
            st=conn.createStatement();
            //4.执行sql
            String sql="select id,username,password,phone,address from t_user";

            //5.执行查询操作
            rs=st.executeQuery(sql);

            //6.处理结果集
            // 需要将数据库查询的结果集映射成Java对象
            // 查询的结果集中每一行数据映射成一个Java对象
            //如果存在多条数据，映射的是一个Java对象集合
            // next()用于读取下一行数据
            //判断下一行是否有数据，如果有数据将这一行映射成一个Java对象
            while(rs.next()){
                User user=new User();

                // getXxx(int columnIndex)获取第几列的数据
                // getXxx(String columnLabel)获取指定列名的数据

                //将查询结果第一列的数据转换成Java的int类型
                int id=rs.getInt(1);
                user.setId(id);
                //查询结果集中列名为username的数据转换成Java中的String类型
                String username=rs.getString("username");
                user.setUsername(username);
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                users.add(user);

            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }
        return users;
    }

    /**
     * 修改用户信息
     * @param user
     */
    public static void updateUser(User user){
        Connection conn=null;
        Statement st=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection(JDBC_URL,"root","root");
            st=conn.createStatement();
            String sql="update t_user set username='"+user.getUsername()+"',password='"+user.getPassword()+"',phone='"+user.getPhone()+"',address='"+user.getAddress()+"' where id='"+user.getId()+"'";
            int rows=st.executeUpdate(sql);
            System.out.println("Query OK:"+rows+" rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }
    }
    public static void deleteById(Integer id){
        Connection conn=null;
        Statement st=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection(JDBC_URL,"root","root");
            st=conn.createStatement();
            String sql="delete from t_user where id="+id;
            int rows=st.executeUpdate(sql);
            System.out.println("Query OK:"+rows+" rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }
    }



}
